package com

import com.core.Generation
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import java.nio.file.Path
import java.nio.file.WatchKey
import kotlin.io.path.*

@Serializable
data class FileInfo(

    var name: String,
    var extension: String,
    /**
     * 要监控的目录路径
     */
    @Serializable(PathSerializer::class) var watchFile: Path,
    /**
     * 要排除以此名字结尾的文件或目录
     */
    var excludes: MutableSet<String> = mutableSetOf(),
    /**
     * 本地文件的根路径 在保存数据的时候 会被删除
     */
    var localRootPath: MutableList<String> = mutableListOf(),

    var cmpressPng: CompressPng = CompressPng(),
    var webp: WEBP = WEBP(),

    /** 输出路径 */
    @Serializable(PathSerializer::class) var outPath: Path = Path("./")
) {

    /**
     * 输出完整路径
     */
    @Transient
    lateinit var outFilePath: Path

    fun fileName(): String {
        return "$name.$extension"
    }

    /**
     * 判断给定的文件路径是否应该被忽略。
     *
     * @param filePath 文件路径，类型为Path。
     * @return 返回一个布尔值，如果文件路径以任何excludes列表中的字符串结尾，则返回true，表示应该忽略该路径；否则返回false。
     */
    fun ignorePath(filePath: Path): Boolean {
        // 检查文件路径是否以excludes列表中的任何字符串结尾
        return excludes.any { filePath.pathString.endsWith(it, true) }
    }

}


/**
 * 用于配置PNG图片压缩的类。
 *
 * @param enable 是否启用PNG图片压缩，默认为false。
 * @param suffix 压缩后图片文件名的后缀，默认为"_low"。
 * @param quality 压缩质量范围，递归压缩的比率，取值范围0-100，默认为"10-80"。
 * @param autoClean 当enable为false时，是否自动清理生成的压缩图片资源，默认为true。
 */
@Serializable
data class CompressPng(
    val enable: Boolean = false,
    val suffix: String = "_low",
    /** 精度，递归压缩的比率 0-100 默认为 10-80 */
    val quality: String = "10-80",
    /**
     * 当 enable=false 的时候自动清理生成的资源
     */
    val autoClean:Boolean = true
) {

    /**
     * 验证图片是否是压缩后的图片资源。
     * 根据文件路径中的suffix来判断图片是否为压缩后的版本。
     *
     * @param filePath 图片文件的路径。
     * @return 如果文件路径以suffix和原始扩展名结尾，则返回true，表示是压缩后的图片；否则返回false。
     */
    fun isVerifyCompress(filePath: Path): Boolean {
        return filePath.pathString.endsWith("${suffix}.${filePath.extension}")
    }

}



/**
 * WEBP配置类，用于配置WEBP图片处理的参数。
 */
@Serializable
data class WEBP(
    /**
     * 是否启用WEBP转换功能。
     * 默认值为false。
     */
    val enable: Boolean = false,
    /**
     * 转换前是否先压缩图片。
     * 默认值为true。
     */
    val compress: Boolean = true,
    /**
     * 指定RGB通道压缩因数，范围在0到100之间。
     * 默认值为75。
     */
    val webpQuality: Int = 75,
    /**
     * 当enable为false时，是否自动清理生成的WEBP资源。
     * 默认值为true。
     */
    val autoClean: Boolean = true
)



data class WatchFile(
    /**
     * 监控器
     */
    var watchKey: WatchKey?,
    /**
     * 监控目录路径
     */
    val path: Path,
    /** 执行解析类 */
    val generation: Generation
)

data class CacheWatch(
    /**
     * 缓存类型 0.更新变化  1.删除
     */
    val type: Int,
    val content: Path,
    val watchFile: WatchFile? = null
)

/**
 * 压缩资源数据
 */
data class CompressData(
    val filePath: Path,
    val suffix: String = "_low",
    /** 精度，递归压缩的比率 0-100 默认为 10-80 */
    val quality: String = "10-80",
    /** 压缩后保存的目录 如果是非目录 会自动获取父目录做为保存路径 */
    val outDir: Path? = null,
    /** 保证输出的文件一定存在 默认true */
    val keepOutFile: Boolean = true
) {

    /**
     * 压缩后的新名字
     */
    fun getCompressName(): String {
        return "${filePath.nameWithoutExtension}${suffix}.${filePath.extension}"
    }

    /**
     * 压缩后的新路径
     */
    fun getCompressPath(): Path {
        if (outDir != null) {
            if (outDir.isDirectory()) return outDir.resolve(getCompressName())
            return outDir.parent.resolve(getCompressName())
        }
        return filePath.parent.resolve(getCompressName())
    }

}

data class ConvertWebp(
    val filePath: Path,
    /** 指定 0 和 100 之间的 RGB 通道压缩因数。默认值为 75。 */
    val webpQuality: Int = 75,
    /** 转换前先压缩图片 */
    val compress: Boolean = true,
    /**
     * 转换完成后删除输入源
     */
    val removeSource: Boolean = false
) {
    /**
     * 转换后的新名字
     */
    fun getConvertName(): String {
        return "${filePath.fileName}.webp"
    }

    /**
     * 转换后的新路径
     */
    fun getConvertPath(): Path {
        return filePath.parent.resolve(getConvertName())
    }
}